package funcdemo

import (
	"fmt"
)

/**
 *闭包的理解： a函数返回b函数，b函数包裹了a函数内部的变量，使a函数被包裹的变量的声明周期变长了。
 */

// CreateLazyLoader 创建一个延迟加载器, 只有在第一次调用时才会执行loadFunc函数加载数据, 第二次直接返回第一次创建的data
func CreateLazyLoader(loadFunc func() interface{}) func() interface{} {
	var data interface{}
	var loaded bool

	return func() interface{} {
		if !loaded {
			data = loadFunc()
			loaded = true
			fmt.Println("数据已加载")
		}
		return data
	}
}

func Fobonacii() func() int {
	a, b := 0, 1
	return func() int {
		a, b = b, a+b
		return a
	}
}
